package com.hfi.observer.demo05;

import java.util.LinkedHashSet;
import java.util.Set;

/**
 * 拉模型
 * 拉模型是目标对象不知道观察者具体需要什么数据，没有办法的情况下，干脆把自身传给观察者，让观察者自己去按需取值
 * @author ChangLiang
 * @date 2019/12/2
 */
interface Observer{
    void update(Notifier notifier);
}

interface Notifier{

    void attach(Observer observer);

    void detach(Observer observer);

    void notifier();

    void setAction(String action);

    String getAction();
}

class Boss implements Notifier{
    private Set<Observer> set = new LinkedHashSet<>();

    @Override
    public void attach(Observer observer) {
        set.add(observer);
    }

    @Override
    public void detach(Observer observer) {
        set.remove(observer);
    }

    private String action;

    @Override
    public void setAction(String action){
        this.action = action;
    }

    @Override
    public String getAction(){
        return this.action;
    }

    @Override
    public void notifier() {
        for (Observer observer : set) {
            // 把Notify自身通过update方法传递给观察者
            // 这样在观察者需要获取数据的时候，就可以通过这个引用来获取了
            observer.update(this);
        }
    }
}

class StockObserver implements Observer {

    private String name;
    // Observer必须知道Notifier的状态信息, 所以它里面必须有个当前Notifier的对象成员.
    private Notifier notifier;

    public StockObserver(String name, Notifier notifier) {
        this.name = name;
        this.notifier = notifier;
    }

    @Override
    public void update(Notifier notifier) {
        System.out.println(notifier.getAction() +" " + name + "关闭股票行情，继续工作 ");
    }
}

class NBAObserver implements Observer {
    private String name;
    private Notifier notifier;
    public NBAObserver(String name, Notifier notifier) {
        this.name = name;
        this.notifier = notifier;
    }

    @Override
    public void update(Notifier notifier) {
        System.out.println(notifier.getAction() +" " + name + "关闭NBA，继续工作 ");
    }
}

public class Test {

    public static void main(String[] args) {
        Boss huhansan = new Boss();

        StockObserver tongshi1 = new StockObserver("魏关姹", huhansan);
        NBAObserver tongshi2 = new NBAObserver("易管查", huhansan);

        //注册两位同事
        huhansan.attach(tongshi1);
        huhansan.attach(tongshi2);
        //解除注册一位同事
        huhansan.detach(tongshi1);
        //发现老板回来
        huhansan.setAction("我胡汉三回来了！");
        //通知
        huhansan.notifier();
    }
}
